package com.qing.springbootinit.manager;

import com.qing.springbootinit.common.ErrorCode;
import com.qing.springbootinit.constant.ChatConstant;
import com.qing.springbootinit.exception.BusinessException;
import com.qing.springbootinit.model.entity.ChatMessages;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.lkeap.v20240522.LkeapClient;
import com.tencentcloudapi.lkeap.v20240522.models.ChatCompletionsRequest;
import com.tencentcloudapi.lkeap.v20240522.models.ChatCompletionsResponse;
import com.tencentcloudapi.lkeap.v20240522.models.Message;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

// * @author <a href="https://github.com/qingfengzy">qingfengzy</a>

@Slf4j
@Component
public class DeepAiManger {
    @Resource
    private LkeapClient deepSeekClient;

    public String doChat(long modelId, String message) {
//        todo 写一下数据预设
        final String SYSTEM_PROMPT = "你是一个数据分析师和前端开发专家，接下来我会按照以下固定格式给你提供内容：\n" +
                "分析需求：\n" +
                "{数据分析的需求或者目标}\n" +
                "原始数据：\n" +
                "{csv格式的原始数据，用,作为分隔符}\n" +
                "请根据这两部分内容，按照以下指定格式生成内容（此外不要输出任何多余的开头、结尾、注释）\n" +
                "【【【【【\n" +
                "{前端 Echarts V5 的 option 配置对象js代码（输出JSON格式），合理地将数据进行可视化，不要生成任何多余的内容，比如注释}\n" +
                "【【【【【\n" +
                "{明确的数据分析结论、越详细越好，不要生成多余的注释}\n"+
                "【【【【【";

        try {
            // 实例化一个请求对象,每个接口都会对应一个request对象
            ChatCompletionsRequest req = new ChatCompletionsRequest();
            req.setModel("deepseek-v3");
            req.setStream(false);
//            设置非流式

            Message[] messages = new Message[2];
            Message message0 = new Message();
            message0.setRole("user");
            message0.setContent(SYSTEM_PROMPT);
            messages[0] = message0;

            Message message1 = new Message();
            message1.setRole("user");
            message1.setContent(message);
            messages[1] = message1;
            req.setMessages(messages);

            // 返回的resp是一个ChatCompletionsResponse的实例，与请求对象对应
            ChatCompletionsResponse resp = deepSeekClient.ChatCompletions(req);
//            因为它会输出一些其他的文字在结尾
            String content = resp.getChoices()[0].getMessage().getContent();
            // 输出json格式的字符串回包
//            if (resp.isStream()) { // 流式响应
//                for (SSEResponseModel.SSE e : resp) {
//                    System.out.println(e.Data);
//                }
//            } else { // 非流式响应
//            return (AbstractModel.toJsonString(resp));
            return content;
//            }
        }catch(
                TencentCloudSDKException e){
        e.printStackTrace();
            log.error("AI对话失败");
            throw new BusinessException(ErrorCode.OPERATION_ERROR,"AI对话失败");
        }


        }
    /**
     * 调用AI 聊天
     * @param messages
     * @return
     */
    public String doChatByAI(List<ChatMessages> messages){
//输入验证
        if(messages == null || messages.isEmpty()){
            log.error("调用ai聊天是消息列表为空");
            throw new BusinessException(ErrorCode.PARAMS_ERROR,"消息列表不能为空");
        }

        String SYSTEM_PROMPT = ChatConstant.SYSTEM_PROMPT;
        try {
            // 构建完整的消息列表，先添加系统提示，再添加用户消息
            List<Message> requestMessages = new ArrayList<>();
            // 添加系统提示
            Message systemMessage = new Message();
            systemMessage.setRole("system");
            systemMessage.setContent(SYSTEM_PROMPT);
            requestMessages.add(systemMessage);

            for (ChatMessages msg : messages){
                Message message = new Message();
                message.setRole(String.valueOf(msg.getSender()));
                message.setContent(msg.getContent());
                requestMessages.add(message);
            }


            // 实例化一个请求对象,每个接口都会对应一个request对象
            ChatCompletionsRequest req = new ChatCompletionsRequest();
            req.setModel("deepseek-v3");
            req.setStream(false);
//            req.setMessages(requestMessages);
//            设置非流式
            Message[] messages1 = requestMessages.toArray(new Message[0]);
            req.setMessages(messages1);
//            Message[] messages = new Message[2];
//            Message message0 = new Message();
//            message0.setRole("user");
//            message0.setContent(SYSTEM_PROMPT);
//            messages[0] = message0;
//
//            Message message1 = new Message();
//            message1.setRole("user");
//            message1.setContent(messages);
//            messages[1] = message1;
//            req.setMessages(messages);

            // 返回的resp是一个ChatCompletionsResponse的实例，与请求对象对应
            ChatCompletionsResponse resp = deepSeekClient.ChatCompletions(req);
//            因为它会输出一些其他的文字在结尾
            // 提取回复内容
            if(resp.getChoices() !=null && resp.getChoices().length>0){
                String content = resp.getChoices()[0].getMessage().getContent();
                log.info("AI对话成功，回复内容长度: {}", content.length());
                return content;
            } else {
                log.error("AI返回的回复内容为空");
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "AI返回内容为空");
            }
//            String content = resp.getChoices()[0].getMessage().getContent();
            // 输出json格式的字符串回包
//            if (resp.isStream()) { // 流式响应
//                for (SSEResponseModel.SSE e : resp) {
//                    System.out.println(e.Data);
//                }
//            } else { // 非流式响应
//            return (AbstractModel.toJsonString(resp));
//            return content;
//            }
        }catch (TencentCloudSDKException e) {
            log.error("AI对话失败: {}", e.getMessage(), e);
            throw new BusinessException(ErrorCode.OPERATION_ERROR, "AI对话失败: " + e.getMessage());
        } catch (Exception e) {
            log.error("处理AI对话时发生未知错误: {}", e.getMessage(), e);
            throw new BusinessException(ErrorCode.OPERATION_ERROR, "AI对话处理异常");
        }


    }
}



